4.4 map
大部分的编程语言都有map这样的数据类型,只是在叫法上有所差异。
在Go语言中,map在实际应用中也是使用比较多的一种数据类型,主要可以用于去重、快速查找等场景。
本节代码存放目录为 lesson9
什么是map?
map可以叫做集合,也可以更直观的叫做键值对存储,或者可以参照其他语言叫做字典。
map很直观的理解就是,它是可以存储两个值,一个叫做键key,一个叫做数值value,通过键key我们可以获取到实际的值value。
map的存储结构如下所示:
A: 1
B: 2
C: 3
D: 4
从上面的表示我们可以看出,map存储的就是两个值,A是key,1是value,所以我们通过A来获取,就可以知道它的实际值为1。
map与我们日常生活中使用的字典其实是很相近的,就是通过一个目录可以找到它实际对应的章节,而且这些目录是不会重复的。
map声明及初始化
map的声明方式有三种,一种是使用var与make配合,一种是使用make直接创建,另外一种是使用map在声明是赋值实现初始化。如下所示:
var a map[string]int
a = make(map[string]int)
在上面的代码中,我们首先使用var声明了一个map的变量,之后通过make对这个变量进行了初始化。
需要注意的是,如果使用这种方式,那么必须要使用make进行初始化,否则在运行的时候是会报错的。
同时我们也可以指定长度,如果不指定的话,map会自动扩容。如下所示,我们在make时指定了map长度为10。
var a map[string]int
a = make(map[string]int, 10)
我们也可以直接使用make对map进行声明同时进行初始化。如下所示:
var b = make(map[string]int)
// 简写
b := make(map[string]int)
在上面的代码中,我们通过make创建了一个map,这样的方式是比较简洁的。
还有一种方式就是我们在声明的时候就为map赋值,那么这样就可以自动完成了初始化。如下所示:
var c = map[string]int{
"A": 1,
}
在map中,key可以是基本数据类型,例如:int、int32、int64、float32、string、bool等,但是不能为:数组、切片、结构体、接口、map。
总之就是,map的key必须是可以比较的,否则都是不符合规则的。
value则可以是任何类型的,包括:基本数据类型、复合数据类型、函数等。
map的操作
map的操作主要包含添加、删除、获取、遍历等操作。
添加数据比较简单,map声明后直接赋值即可。如下所示:
a["A"] = 1
在上面的代码中,添加了一个key为A,value为1的键值对。
元素的删除我们可以使用delete方法。如下所示:
delete(a, "A")
获取值也比较简单,如下所示:
fmt.Println(a["A"])
在获取值的时候,我们还有另一种方式,如下所示:
ok, value := a["A"]
fmt.Println(ok)
fmt.Println(value)
在上面的代码中,我们使用ok、value两个值来获取接收结果。
其中ok表示在map中是否有key为A的值,如果有的话ok等于true,否则为false。
value表示实际获取到的值,同时如果不存在的话,那么value就是map值类型的默认值。
比如这里的map类型是map[string]int,那么value的默认值就是0。
如果是这样map[int]string,此时value的类型为string,那么默认值就是空字符串。
对于map的遍历就比较简单,与之前我们讲到的数组、切片是差不多的,只不过不同的是map只能使用for range进行遍历。如下所示:
var c = map[string]int{
"A": 1,
"B": 2,
}
for key, value := range c {
fmt.Printf("key-> %s, value-> %d\n", key, value)
}
需要注意的是,map是无序的,也就是说,使用for range遍历时,你会发现每次的输出结果都是不一样的。
结果输出如下:
key-> B, value-> 2
key-> A, value-> 1
小结
map是一种常用的数据类型,通过map可以快捷的进行一些数据操作。针对本节总结如下:
可以通过
var与make结合进行声明及初始化可以通过
make同时完成声明及初始化map可以通过var直接进行声明并赋值key是不能重复的key必须是可以相比较的value可以是任意类型的值可以通过
delete删除键值对存储的
key是无序的可以通过
for range进行遍历